package com.hz.cheetah.sample.client;

import com.hz.cheetah.sample.api.HelloService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

/**
 * 分布式rpc测试流程，
 多服务器，单客户端，单线程测试，测试一个流程，有无问题。
 多服务器，单客户端，单线程，服务器任意一台停止，流程走完，有无问题。观察是否有消息处于等待状态
 多服务器，单客户端，服务器测试过程中，多次启动，停止，观看流程是否能正常进行。

 多服务器，单客户端，多线程，服务器都不停止，测试一个流程，有无问题。
 多服务器，单客户端，多线程，服务器任意一台停止，流程走完，有无问题。 错误：观察是否有对条消息在等待状态。
 多服务器，单客户端，多线程，服务器测试过程中，多次启动，停止，观看流程是否能正常进行。


 多服务器，多客户端，重新按上诉流程测试


 */
@ContextConfiguration(locations = {"classpath*:/spring.xml"})
@RunWith(SpringJUnit4ClassRunner.class)
public class HelloClient3 {

    private static final Logger LOGGER = LoggerFactory.getLogger(HelloClient3.class);

    @Autowired()
    @Qualifier("HelloService")
    HelloService helloService;

    @Test
    public void testStringg() throws Exception {
        for(int i=0;i<3;i++) {
            final CountDownLatch latch = new CountDownLatch(1);
            send();
            latch.await(5000, TimeUnit.MILLISECONDS);
        }
        final CountDownLatch latch = new CountDownLatch(1);
        //send();
        latch.await();
    }

    private void send(){
        int loopCount = 10000;

        long start = System.currentTimeMillis();
        int count = 0;
        for (int i = 0; i < loopCount; i++) {
            String result = helloService.hello("World");
            if(result == null){
                count++;
            }
            System.out.println(i + ":" + result);
        }

        long time = System.currentTimeMillis() - start;
        System.out.println("loop: " + loopCount+" ok:"+count);
        System.out.println("time: " + time + "ms");
        System.out.println("tps: " + (double) loopCount / ((double) time / 1000));
    }
}
